home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 May: Tool Chest / Dev.CD May 98 TC.toast / Tool Chest / Networking / MacTCP / MPing 1.1 / Sources / resolver.c < prev   
Encoding:
C/C++ Source or Header  |  1991-09-30  |  5.2 KB  |  241 lines  |  [TEXT/MPS ]

  1. /*------------------------------------------------------------------------------
  2. #    MPing 1.1 - MacTCP Ping Tool
  3. #
  4. #    Copyright © Apple Computer, Inc. 1990-1991
  5. #    All rights reserved.
  6. #
  7. #    Versions:    
  8. #                1.1        September 25, 1991.
  9. #
  10. #    File:
  11. #                MPing.c
  12. #
  13. #    Components:
  14. #                AddressXlation.h
  15. #                MacTCPCommonTypes.h
  16. #                Makefile
  17. #                MiscIPPB.h
  18. #                MPing.c
  19. #                MPing.h
  20. #                MPing.r
  21. #                MPingDlg.c
  22. #                MPingExtern.h
  23. #                MPingGlobals.h
  24. #                MPingIcmp.c
  25. #                MPingWindow.c
  26. #                resolver.c
  27. ------------------------------------------------------------------------------*/
  28. /*     resolver.c - DNR library for MPW
  29.  
  30.     (c) Copyright 1988 by Apple Computer.  All rights reserved
  31.     Jan 9, 1991.
  32.  
  33.     modified by RAB
  34. */
  35.  
  36. #include <Resources.h>
  37. #include <Files.h>
  38. #include <OSUtils.h>
  39. #include <Memory.h>
  40. #include <Errors.h>
  41. #include <Traps.h>
  42. #include <GestaltEqu.h>
  43. #include <Folders.h>
  44. #include <ToolUtils.h>
  45.  
  46. #define OPENRESOLVER    1
  47. #define CLOSERESOLVER    2
  48. #define STRTOADDR        3
  49. #define    ADDRTOSTR        4
  50. #define    ENUMCACHE        5
  51. #define ADDRTONAME        6
  52. #define    HINFO            7
  53. #define MXINFO            8
  54.  
  55. Handle codeHndl = nil;
  56.  
  57. typedef OSErr (*OSErrProcPtr)();
  58. OSErrProcPtr dnr = nil;
  59.  
  60.  
  61. TrapType GetTrapType(theTrap)
  62. unsigned long theTrap;
  63. {
  64.     if (BitAnd(theTrap, 0x0800) > 0)
  65.         return(ToolTrap);
  66.     else
  67.         return(OSTrap);
  68. }
  69.  
  70. Boolean TrapAvailable1(trap)
  71. unsigned long trap;
  72. {
  73.     TrapType trapType = ToolTrap;
  74.     unsigned long numToolBoxTraps;
  75.  
  76.     if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xAA6E, ToolTrap))
  77.         numToolBoxTraps = 0x200;
  78.     else
  79.         numToolBoxTraps = 0x400;
  80.  
  81.     trapType = GetTrapType(trap);
  82.     if (trapType = ToolTrap) {
  83.         trap = BitAnd(trap, 0x07FF);
  84.         if (trap > numToolBoxTraps)
  85.             trap = _Unimplemented;
  86.     }
  87.     return(NGetTrapAddress(trap, trapType) != NGetTrapAddress(_Unimplemented, ToolTrap));
  88. }
  89.  
  90. short GetCPanelFolder()
  91. {
  92.     short vRefNum = 0;
  93.     long dirID = 0;
  94.     SysEnvRec info;
  95.     Boolean hasFolderMgr, hasGestalt = false;
  96.     long feature;
  97.     short wdRef;
  98.  
  99.     dirID = 0;
  100.     if (TrapAvailable1(_GestaltDispatch)) if (Gestalt(gestaltFindFolderAttr, &feature) == noErr) hasFolderMgr = true;
  101.     if (!hasFolderMgr) {
  102.         SysEnvirons(1, &info);
  103.         return(info.sysVRefNum);
  104.     }
  105.     else {
  106.         if (FindFolder(kOnSystemDisk, kControlPanelFolderType, kDontCreateFolder, &vRefNum, &dirID) != noErr) return(0);
  107.         if (OpenWD(vRefNum, dirID, 'dnrp', &wdRef) == noErr)
  108.             return(wdRef);
  109.         else
  110.             return(0);
  111.     }
  112. }
  113.  
  114. /* OpenOurRF is called to open the MacTCP driver resources */
  115. short OpenOurRF()
  116. {
  117.     ParamBlockRec fi;
  118.     Str255 filename;
  119.     short vRefNum;
  120.  
  121.     vRefNum = GetCPanelFolder();
  122.     fi.fileParam.ioCompletion = nil;
  123.     fi.fileParam.ioNamePtr = &filename;
  124.     fi.fileParam.ioVRefNum = vRefNum;
  125.     fi.fileParam.ioFDirIndex = 1;
  126.  
  127.     while (PBGetFInfo(&fi, false) == noErr) {
  128.         /* scan system folder for driver resource files of specific type & creator */
  129.         if (fi.fileParam.ioFlFndrInfo.fdType == 'cdev' &&
  130.             fi.fileParam.ioFlFndrInfo.fdCreator == 'ztcp') {
  131.             /* found the MacTCP driver file */
  132.             return(OpenRFPerm(&filename, vRefNum, fsRdPerm));
  133.         }
  134.         /* check next file in system folder */
  135.         fi.fileParam.ioFDirIndex++;
  136.     }
  137.     return(-1);
  138. }    
  139.  
  140. OSErr OpenResolver(fileName)
  141. char *fileName;
  142. {
  143.     short refnum;
  144.     OSErr rc;
  145.     long feature = 0;
  146.     Boolean hasTimeMgr = false;
  147.  
  148.     if (dnr != nil)
  149.         /* resolver already loaded in */
  150.         return(noErr);
  151.  
  152.     /* open the MacTCP driver to get DNR resources. Search for it based on
  153.        creator & type rather than simply file name */    
  154.     refnum = OpenOurRF();
  155.  
  156.     /* ignore failures since the resource may have been installed in the 
  157.        System file if running on a Mac 512Ke */
  158.  
  159.     /* load in the DNR resource package */
  160.     codeHndl = GetIndResource('dnrp', 1);
  161.  
  162.     if (codeHndl == nil) {
  163.         /* can't open DNR */
  164.         return(ResError());
  165.     }
  166.  
  167.     DetachResource(codeHndl);
  168.     if (refnum != -1) {
  169.         CloseWD(refnum);
  170.         CloseResFile(refnum);
  171.     }
  172.  
  173.     /* lock the DNR resource since it cannot be reloated while opened */
  174.     HLock(codeHndl);
  175.     dnr = (OSErrProcPtr) *codeHndl;
  176.  
  177.     /* call open resolver */
  178.     rc = (*dnr)(OPENRESOLVER, fileName);
  179.     if (rc != noErr) {
  180.         /* problem with open resolver, flush it */
  181.         HUnlock(codeHndl);
  182.         DisposHandle(codeHndl);
  183.         dnr = nil;
  184.     }
  185.  
  186.     /* check is the extended time manager is available */
  187.     if (TrapAvailable1(_GestaltDispatch)) if (Gestalt(gestaltTimeMgrVersion, &feature) == noErr) hasTimeMgr = true;
  188.     if (hasTimeMgr) {
  189.         if ((feature == gestaltExtendedTimeMgr) || (feature == gestaltRevisedTimeMgr))
  190.             rc == noErr;
  191.         else rc == 1;
  192.     }
  193.  
  194.     return(rc);
  195. }
  196.  
  197. OSErr CloseResolver()
  198. {
  199.     if (dnr == nil)
  200.         /* resolver not loaded error */
  201.         return(notOpenErr);
  202.  
  203.     /* call close resolver */
  204.     (void) (*dnr)(CLOSERESOLVER);
  205.  
  206.     /* release the DNR resource package */
  207.     HUnlock(codeHndl);
  208.     DisposHandle(codeHndl);
  209.     dnr = nil;
  210.     return(noErr);
  211. }
  212.  
  213. OSErr StrToAddr(hostName, rtnStruct, resultproc, userDataPtr)
  214. char *hostName;
  215. struct hostInfo *rtnStruct;
  216. long resultproc;
  217. char *userDataPtr;
  218. {
  219.     return((*dnr)(STRTOADDR, hostName, rtnStruct, resultproc, userDataPtr));
  220. }
  221.  
  222. void AddrToStr(addr, addrStr)
  223. unsigned long addr;
  224. char *addrStr;                                    
  225. {
  226.     (*dnr)(ADDRTOSTR, addr, addrStr);
  227. }
  228.  
  229. OSErr AddrToName(addr, rtnStruct, resultproc, userDataPtr)
  230. unsigned long addr;
  231. struct hostInfo *rtnStruct;
  232. long resultproc;
  233. char *userDataPtr;                                    
  234. {
  235.     if (dnr == nil)
  236.         /* resolver not loaded error */
  237.         return(notOpenErr);
  238.  
  239.     return((*dnr)(ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr));
  240. }
  241.